/**
 * 判断是否为string类型
 * @param val 入参
 * @returns 是返回true，反之则反
 */
export const isString = (val:any) => typeof (val) === 'string' || val instanceof String

/**
 * 判断是否是日期
 * @param val 入参
 * @returns 是返回true，反之则反
 */
export const isDate = (val:any) => (val instanceof Date)

/**
 * 判断是否是数组
 * @param val 入参
 * @returns 是返回true，反之则反
 */
export function isArray(val:any) {
    if (typeof Array.isArray === 'undefined') {
        return Object.prototype.toString.call(val) === '[object Array]'
    }
    return Array.isArray(val)
}

/**
 * 判断两个对象是否相同
 * @param a 要比较的对象一
 * @param b 要比较的对象二
 * @returns 相同返回 true，反之则反
 */
export function isEqual(a: { [key: string]: any }, b: { [key: string]: any }) {
    if (!a || !b) return false
    const aProps = Object.getOwnPropertyNames(a)
    const bProps = Object.getOwnPropertyNames(b)
    if (aProps.length !== bProps.length) return false
    for (let i = 0; i < aProps.length; i++) {
        const propName = aProps[i]
        const propA = a[propName]
        const propB = b[propName]
        if (!b.hasOwnProperty(propName)) return false
        if (propA instanceof Object) {
            if (!isEqual(propA, propB)) return false
        } else if (propA !== propB) {
            return false
        }
    }
    return true
}

/**
 * 对象深克隆
 * @param val 源对象
 * @returns 克隆后的对象
 */
export function deepClone(val: any) {
    let newObj: any
    try {
        newObj = val.push ? [] : {}
    } catch (error) {
        newObj = {}
    }
    for (const attr in val) {
        if (val[attr] !== null && typeof val[attr] === 'object') {
            newObj[attr] = deepClone(val[attr])
        } else {
            newObj[attr] = val[attr]
        }
    }
    return newObj
}

/**
 * 判断是否为空
 * @param val 入参
 * @returns 是返回true，反之则反
 */
export const isNull = (val:any) => typeof (val) === 'undefined' || val === '' || val == null

export const isNullObj = (val:any) => JSON.stringify(val) === '{}'

/**
 * 判断是否为函数
 * @param val 入参
 * @returns 是返回true，反之则反
 */
export function isFunction(val:any) {
    return typeof (val) === 'function'
}
